<?php

namespace origin;

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\FirePHPHandler;

/**
 * 日志类
 * 该类依赖于 Monolog
 */
class Log
{

	public static $instance = null;

	public static $logid = null;

	protected static $methods = [
		'debug',
		'info',
		'notice',
		'warn',
		'warning',
		'err',
		'error',
		'crit',
		'critical',
		'alert',
		'emerg',
		'emergency'
	];

	/**
	 * 获取实例
     * @param string 	$method 	方法名称
     * @return object
	 */
	public static function instance (
		string $name = 'log' ,
		$file = '' ,
		$level = 100 
	) {

		if (self::$instance) {
			return self::$instance;
		}

		if (!$file) {
			$file = __DIR__ . '/applog.log';
		}

		// 创建日志服务
		$logger = new Logger($name);
		// 添加一些处理器
		$logger->pushHandler(new StreamHandler($file, $level));
		$logger->pushHandler(new FirePHPHandler());

		// 收集
		self::$instance = $logger;
		// 日志id
		if (!self::$logid) {
			self::$logid = self::logid();
		}

		return $logger;
	}

	/**
	 * 日志ID
     * @return int logid
	 */
	public static function logid () {
		// 日志id
		return bcmul(microtime(true), 1000);
	}

	/**
	 * 默认输出
     * @param  array $trace 追踪数据
     * @return string
	 */
	public static function format ( $trace ) {

		$file = '';
		$line = 0;

		// 日志追踪
		foreach ($trace as $val) {
			if (isset($val['file']) && isset($val['line'])) {
				$file = $val['file'];
				$line = $val['line'];
				break;
			}
		}

		$t = microtime(true);

		return sprintf('[%s] time[%s] [%s:%s]', self::$logid, $t, $file, $line);
	}

	/**
	 * 静态调用不存在的方法
     * @param string 	$method 	方法名称
     * @param array 	$params 	请求参数
     * @return bool
	 */
	public static function __callStatic( $method , $params )
	{
		if (!in_array($method, self::$methods)) {
			throw new \Exception("Monolog not found the method", 500);
		}

		// 获取实例
		$logger = self::instance();

		// 现在你就可以用日志服务了
		return $logger->$method(self::format(debug_backtrace()), $params);
	}
}
